package py.com.sole.solesys;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FlowEvent;
import org.primefaces.event.SelectEvent;
import py.com.sole.dao.DaoFactory;
import py.com.sole.dto.PadrePersonaDTO;
import py.com.sole.model.Alumno;
import py.com.sole.model.Direccion;
import py.com.sole.model.Padre;

@ManagedBean
@SessionScoped
public class PadreBean extends Persona implements Serializable {

  private static final long serialVersionUID = 1L;

  private ArrayList<String> results;
  private List<Padre> listPadres;
  private List<PadrePersonaDTO> padresFilter;
  private List<PadrePersonaDTO> padres;
  private PadrePersonaDTO padreSelected;
  private AlumnoBean alumno;
  private List<AlumnoBean> alumnos;
  private py.com.sole.solesys.Persona p;
  private Padre padre;
  private List<Padre> listaPadreSelec;
  private boolean bloquearBotones = true;

  @PostConstruct
  private void init() {
    listaPadreSelec = new ArrayList<Padre>();
    alumnos = new ArrayList<AlumnoBean>();
    padres = DaoFactory.getPadre().getPadrePersona();
  }

  public String onFlowProcess(FlowEvent event) {
    return event.getNewStep();
  }

  public void clean() {

    this.setNombre(null);
    this.setApellido(null);
    this.setDireccion(null);
    this.setDocumento(null);
    this.setTelefono(null);
    this.setEmail(null);

    this.padreSelected = null;
    this.bloquearBotones = true;

  }

  public void savePadre() {

    FacesContext context = FacesContext.getCurrentInstance();

    py.com.sole.model.Persona perPadre = new py.com.sole.model.Persona();
    Padre padre = new Padre();
    List<py.com.sole.model.Alumno> listAlumno = new ArrayList<Alumno>();

    Direccion direccion = new Direccion();
    direccion.setDescripcion(this.getDireccion());
    direccion.setCiudad(this.getCiudad());
    direccion = DaoFactory.getDireccion().addDireccion(direccion);

    perPadre.setNombre(this.getNombre());
    perPadre.setApellido(this.getApellido());
    perPadre.setDireccion(direccion);
    perPadre.setSexo("N");
    perPadre.setEmail(this.getEmail());
    perPadre.setTelefono(this.getTelefono());
    perPadre.setTipoDocumentoId(getTipoDocumento());
    perPadre.setDocumento(this.getDocumento());

    perPadre = DaoFactory.getPersona().addPersona(perPadre);

    padre.setPersona(perPadre);
    padre.setAlumnoList(listAlumno);
    padre.setActivo(true);

    DaoFactory.getPadre().addPadre(padre);

    context.addMessage(null, new FacesMessage("Mensaje", "Padre "
                                              + padre.getPersona().getNombre() + " almacenado exitosamente"));

    padres = DaoFactory.getPadre().getPadrePersona();

    this.clean();

  }

  public void searchPadres() {
    List<Padre> padres = DaoFactory.getPadre().getPadreByFilter(this.getTipoDocumento(), this.getNombre(), this.getApellido(), this.getDocumento());

    if (padres.isEmpty()) {
      FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Resultado de la consulta", "No se encontraron registros");
      FacesContext.getCurrentInstance().addMessage(null, message);
    } else if (padres.size() == 1) {
      this.setNombre(padres.get(0).getPersona().getNombre());
      this.setApellido(padres.get(0).getPersona().getApellido());
      this.setCiudad(padres.get(0).getPersona().getDireccion().getCiudad());
      this.setDireccion(padres.get(0).getPersona().getDireccion().getDescripcion());
      this.setTipoDocumento(padres.get(0).getPersona().getTipoDocumentoId());
      this.setDocumento(padres.get(0).getPersona().getDocumento());
      this.setTelefono(padres.get(0).getPersona().getTelefono());
      this.setEmail(padres.get(0).getPersona().getEmail());
      RequestContext.getCurrentInstance().update("padre-form");
    } else {
      this.listPadres = padres;
    }

  }

  public void onRowSelect(SelectEvent event) {

    this.padreSelected = (PadrePersonaDTO) event.getObject();
    this.padre = DaoFactory.getPadre().getPadreById(this.padreSelected.getId());
    direccion = (padre.getPersona().getDireccion().getDescripcion());
    ciudad = (padre.getPersona().getDireccion().getCiudad());
    nombre = (padre.getPersona().getNombre());
    apellido = (padre.getPersona().getApellido());
    tipoDocumento = (padre.getPersona().getTipoDocumentoId());
    documento = (padre.getPersona().getDocumento());
    telefono = (padre.getPersona().getTelefono());
    email = (padre.getPersona().getEmail());

    this.bloquearBotones = false;
    RequestContext.getCurrentInstance().update("form-edit:pnlGridPadre");
    RequestContext.getCurrentInstance().update("padre-form");
  }

  public void addPadres() {
    PadreBean padre = new PadreBean();
    padre.setApellido("");
  }

  public void addAlumnos() {
    AlumnoBean a = new AlumnoBean();
    a.setNombre(alumno.getNombre());
    a.setApellido(alumno.getApellido());
    a.setDireccion(alumno.getDireccion());
    a.setCiudad(alumno.getCiudad());
    a.setTelefono(alumno.getTelefono());
    a.setEmail(alumno.getEmail());
    this.alumnos.add(alumnos.size(), a);
  }

  @SuppressWarnings(value = "all")
  public boolean filterByNombre(Object value, Object filter, Locale locale) {

    String filterText = (filter == null) ? null : filter.toString().trim();

    if (filterText == null || filterText.equals("")) {
      return true;
    }

    if (value == null) {
      return false;
    }

    return ((Comparable<String>) value).compareTo(filterText) > 0;
    //return ((Comparable) value).compareTo(Integer.valueOf(filterText)) > 0;

  }

  public void deletePadre() {
    //DaoFactory.getPadre().deletePadre(this.getPadreSelected().getId());
    Padre padre = DaoFactory.getPadre().getPadreById(
      this.getPadreSelected().getId());
    FacesContext context = FacesContext.getCurrentInstance();

    padre.getPersona().setNombre(this.getNombre());
    padre.getPersona().setApellido(this.getApellido());
    Direccion dire = padre.getPersona().getDireccion();
    dire.setCiudad(ciudad);
    dire.setDescripcion(direccion);
    dire = DaoFactory.getDireccion().updateDireccion(dire);
    padre.getPersona().setDireccion(dire);
    padre.getPersona().getTipoDocumentoId();
    padre.getPersona().setDocumento(this.getDocumento());
    padre.getPersona().setTelefono(this.getTelefono());
    padre.getPersona().setEmail(this.getEmail());
    padre.setActivo(false);
    
    DaoFactory.getPadre().updatePadre(padre);
    context.addMessage(null, new FacesMessage("Mensaje", "Padre "
                                              + " eliminado exitosamente"));

    padres = DaoFactory.getPadre().getPadrePersona();
    this.clean();
  }

  public void editPadre() {
    Padre padre = DaoFactory.getPadre().getPadreById(
      this.getPadreSelected().getId());
    FacesContext context = FacesContext.getCurrentInstance();

    padre.getPersona().setNombre(this.getNombre());
    padre.getPersona().setApellido(this.getApellido());
    Direccion dire = padre.getPersona().getDireccion();
    dire.setCiudad(ciudad);
    dire.setDescripcion(direccion);
    dire = DaoFactory.getDireccion().updateDireccion(dire);
    padre.getPersona().setDireccion(dire);
    padre.getPersona().getTipoDocumentoId();
    padre.getPersona().setDocumento(this.getDocumento());
    padre.getPersona().setTelefono(this.getTelefono());
    padre.getPersona().setEmail(this.getEmail());

    DaoFactory.getPadre().updatePadre(padre);
    context.addMessage(null, new FacesMessage("Mensaje", "Padre "
                                              + " editado exitosamente"));

    padres = DaoFactory.getPadre().getPadrePersona();
    this.clean();
  }

  public void loadAlumno() {

  }

  public List<Padre> getListPadres() {
    return listPadres;
  }

  public void setListPadres(List<Padre> listPadres) {
    this.listPadres = listPadres;
  }

  public List<PadrePersonaDTO> getPadres() {
    if (padres == null) {
      padres = DaoFactory.getPadre().getPadrePersona();
    }
    return padres;
  }

  public void setPadres(List<PadrePersonaDTO> padres) {
    this.padres = padres;
  }

  public List<AlumnoBean> getAlumnos() {
    return alumnos;
  }

  public void setAlumnos(List<AlumnoBean> alumnos) {
    this.alumnos = alumnos;
  }

  public List<PadrePersonaDTO> getPadresFilter() {
    return padresFilter;
  }

  public void setPadresFilter(List<PadrePersonaDTO> padresFilter) {
    this.padresFilter = padresFilter;
  }

  public PadrePersonaDTO getPadreSelected() {
    return padreSelected;
  }

  public void setPadreSelected(PadrePersonaDTO padreSelected) {
    this.padreSelected = padreSelected;
  }

  public boolean isBloquearBotones() {
    return bloquearBotones;
  }

  public void setBloquearBotones(boolean bloquearBotones) {
    this.bloquearBotones = bloquearBotones;
  }

  public Persona getP() {
    return p;
  }

  public void setP(Persona p) {
    this.p = p;
  }

  public ArrayList<String> getResults() {
    return results;
  }

  public void setResults(ArrayList<String> results) {
    this.results = results;
  }

  public Padre getPadre() {
    return padre;
  }

  public void setPadre(Padre padre) {
    this.padre = padre;
  }

  public List<Padre> getListaPadreSelec() {
    return listaPadreSelec;
  }

  public void setListaPadreSelec(List<Padre> listaPadreSelec) {
    this.listaPadreSelec = listaPadreSelec;
  }

}
